home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / Development / PowerD / powerd / source / fd2m.d < prev    next >
Text File  |  2002-10-28  |  7KB  |  237 lines

  1. // history:
  2. // 1.0 initial release
  3. // 1.1 (1.4.01) improved source name recognition
  4. // 1.2 (6.2.02) Fixed a small bug (DMX)
  5. // 1.3 (29.4.02) Fixed fpu recognition (DMX)
  6.  
  7. MODULE  'exec/memory'
  8.  
  9. OPT OSVERSION=37,DOSONLY,OPTIMIZE=3
  10.  
  11. ENUM  T_VOID,T_PTR_TO_CHAR,T_PTR_TO_TagItem
  12. ENUM  SOURCE,PRIVAT
  13.  
  14. PROC main()
  15.   DEF myargs:PTR TO LONG,rdargs,dest[256]:STRING,src[256]:STRING,tmp[256]:STRING,f
  16.   DEF vers='$VER: fd2m v1.3 by MarK and DMX (29.4.2002)'
  17.   myargs:=[NIL,NIL]
  18.   IF rdargs:=ReadArgs('SOURCE/A,PRIVATE/S',myargs,NIL)
  19.     IF StrCmp(myargs[SOURCE]+StrLen(myargs[SOURCE])-7,'_lib.fd')
  20.       StrCopy(tmp,myargs[SOURCE],StrLen(myargs[SOURCE])-7)
  21.       StrCopy(src,myargs[SOURCE])
  22.       StringF(dest,'\s.m',tmp)
  23.       CONVERT
  24.     ELSEIF StrCmp(myargs[SOURCE]+StrLen(myargs[SOURCE])-3,'.fd')
  25.       StrCopy(tmp,myargs[SOURCE],StrLen(myargs[SOURCE])-3)
  26.       StrCopy(src,myargs[SOURCE])
  27.       StringF(dest,'\s.m',tmp)
  28.       CONVERT
  29.     ELSE
  30.       StringF(src,'\s.fd',myargs[SOURCE])
  31.       IF f:=Open(src,OLDFILE)
  32.         Close(f)
  33.         StrCopy(tmp,myargs[SOURCE],StrLen(myargs[SOURCE]))
  34.         StringF(dest,'\s.m',tmp)
  35.         CONVERT
  36.       ELSE
  37.         StringF(src,'\s_lib.fd',myargs[SOURCE])
  38.         IF f:=Open(src,OLDFILE)
  39.           Close(f)
  40.           StringF(dest,'\s.m',myargs[SOURCE])
  41.           CONVERT
  42.         ELSE PrintFault(IOErr(),'fd2m')
  43.       ENDIF
  44.     ENDIF
  45.     FreeArgs(rdargs)
  46.   ELSE
  47.     PrintFault(IOErr(),'fd2m')
  48.   ENDIF
  49.   SUB CONVERT
  50.     Convert(src,dest,IF myargs[PRIVAT] THEN TRUE ELSE FALSE)
  51.   ENDSUB
  52. ENDPROC
  53.  
  54. PROC Convert(src:PTR TO CHAR,dst:PTR TO CHAR,private)
  55.   DEF s,d,m,l
  56.   IF s:=Open(src,OLDFILE)
  57.     IF d:=Open(dst,NEWFILE)
  58.       IF m:=AllocVec(l:=FileLength(src),MEMF_PUBLIC|MEMF_CLEAR)
  59.         Read(s,m,l)
  60.         Process(d,m,l,private)
  61.         FreeVec(m)
  62.       ENDIF
  63.       Close(d)
  64.     ELSE PrintFault(IOErr(),'fd2m')
  65.     Close(s)
  66.   ELSE PrintFault(IOErr(),'fd2m')
  67. ENDPROC
  68.  
  69. PROC Process(o,src:PTR TO CHAR,length,private)
  70.   DEF pos=0,offset=30,public=TRUE,name[256]:CHAR,l,next,nofirst
  71.   DEF argtype[64]:CHAR,p,q,cpu="68k",usingcpu="68k"
  72.   WHILE pos<length
  73.     IF src[pos]="*"
  74.       pos:=NextLine(src,pos,length)
  75.     ELSEIF (src[pos]="#")&&(src[pos+1]="#")
  76. //      PrintF('##\d\n',pos)
  77.       pos:=pos+2
  78.       IF StrCmp(src+pos,'base',4)
  79.         VFPrintF(o,'LIBRARY ',NIL)
  80.         nofirst:=FALSE
  81.         Flush(o)
  82.         Write(o,src+pos+6,WordLength(src,pos+6,length))
  83.         pos:=NextLine(src,pos,length)
  84.       ELSEIF StrCmp(src+pos,'bias',4)
  85.         offset:=Val(src+pos+5)
  86.         pos:=NextLine(src,pos,length)
  87.       ELSEIF StrCmp(src+pos,'public',6)
  88.         public:=TRUE
  89.         pos:=NextLine(src,pos,length)
  90.       ELSEIF StrCmp(src+pos,'private',7)
  91.         public:=FALSE
  92.         pos:=NextLine(src,pos,length)
  93.       ELSEIF StrCmp(src+pos,'shadow',6)
  94.         offset-=6
  95.         pos:=NextLine(src,pos,length)
  96.       ELSEIF StrCmp(src+pos,'abi',3)
  97.         pos+=4
  98.         WHILE src[pos]=" " OR src[pos]="\t" DO pos++
  99.         IF StrCmp(src+pos,'M68k',4) OR StrCmp(src+pos,'M68K',4) OR StrCmp(src+pos,'m68k',4)
  100.           cpu:="68k"
  101.         ELSEIF StrCmp(src+pos,'PPC0',4) OR StrCmp(src+pos,'ppc0',4)
  102.           cpu:="ppc0"
  103.         ELSEIF StrCmp(src+pos,'PPC2',4) OR StrCmp(src+pos,'ppc2',4)
  104.           cpu:="ppc2"
  105.         ELSEIF StrCmp(src+pos,'PPC',3) OR StrCmp(src+pos,'ppc',3)
  106.           cpu:="ppc"
  107.         ENDIF
  108.         pos:=NextLine(src,pos,length)
  109.       ELSEIF StrCmp(src+pos,'end',3)
  110.         RETURN
  111.       ENDIF
  112.     ELSE
  113. //      WriteF('\d\n',pos)
  114.       IF public=TRUE OR (public=FALSE AND private=TRUE)
  115.         IF cpu<>usingcpu
  116.           IF nofirst THEN VFPrintF(o,',\n',NIL)
  117.           SELECT cpu
  118.           CASE "68k"; VFPrintF(o,'M68K',NIL)
  119.           CASE "ppc"; VFPrintF(o,'PPC',NIL)
  120.           CASE "ppc0";VFPrintF(o,'PPC0',NIL)
  121.           CASE "ppc2";VFPrintF(o,'PPC2',NIL)
  122.           ENDSELECT
  123.           nofirst:=TRUE
  124.           usingcpu:=cpu
  125.         ENDIF
  126.  
  127.         StrCopy(name,src+pos,l:=WordLength(src,pos,length))
  128.         pos+=l
  129.         pos++               // skip "("
  130.         IF nofirst THEN VFPrintF(o,',',NIL)
  131.         nofirst:=TRUE
  132.         VFPrintF(o,'\n\t\s(',[name])
  133.         IF cpu="ppc" OR cpu="ppc0" OR cpu="ppc2"
  134.           p:=0
  135.           WHILE src[pos]<>")"
  136.             name[p]:=src[pos]
  137.             IF name[p]="/" THEN name[p]:=","
  138.             pos++
  139.             p++
  140.           ENDWHILE
  141.           name[p]:="\0"
  142.           VFPrintF(o,'\s',[name])
  143.         ELSE
  144.           p:=0
  145.           WHILE src[pos]<>")"
  146.             argtype[p]:=T_VOID
  147.             IF StrCmp(src+pos,'title',STRLEN)
  148.               argtype[p]:=T_PTR_TO_CHAR
  149.               q:=5
  150.             ELSEIF StrCmp(src+pos,'name',STRLEN)
  151.               argtype[p]:=T_PTR_TO_CHAR
  152.               q:=4
  153.             ELSEIF StrCmp(src+pos,'text',STRLEN)
  154.               argtype[p]:=T_PTR_TO_CHAR
  155.               q:=4
  156.             ELSEIF StrCmp(src+pos,'tags',STRLEN)
  157.               argtype[p]:=T_PTR_TO_TagItem
  158.               q:=4
  159.             ELSEIF StrCmp(src+pos,'args',STRLEN)
  160.               argtype[p]:=T_PTR_TO_TagItem
  161.               q:=4
  162.             ELSEIF StrCmp(src+pos,'taglist',STRLEN)
  163.               q:=7
  164.               argtype[p]:=T_PTR_TO_TagItem
  165.             ELSE
  166.               REPEAT
  167.                 pos++
  168.               UNTIL (src[pos]=",")||(src[pos]=")")
  169.               q:=0
  170.             ENDIF
  171.             pos:=pos+q
  172.             IF src[pos]=","
  173.               pos++           // skip ","
  174.             ENDIF
  175.             p++
  176.             IF CtrlC() THEN RETURN
  177.           ENDWHILE
  178.           pos+++               // skip ")" & "("
  179.           IF src[pos]<>")"
  180.             next:=TRUE
  181.             p:=0
  182.             WHILE next
  183.               IF (StrCmp(src+pos,'a',1) || StrCmp(src+pos,'A',1))
  184.                 VFPrintF(o,'a',NIL)
  185.                 pos++
  186.               ELSEIF (StrCmp(src+pos,'d',1) || StrCmp(src+pos,'D',1))
  187.                 VFPrintF(o,'d',NIL)
  188.                 pos++
  189.               ELSEIF (StrCmp(src+pos,'f',1) || StrCmp(src+pos,'F',1) && StrCmp(src+pos+1,'p',1) || StrCmp(src+pos+1,'P',1))
  190.                 VFPrintF(o,'fp',NIL)
  191.                 pos+++
  192.               ENDIF
  193.               IF (src[pos]>="0")&&(src[pos]<="7") THEN VFPrintF(o,'\d',[UByte(src+pos)-"0"])
  194.               pos++
  195.               SELECT argtype[p]
  196.               CASE T_PTR_TO_CHAR;   VFPrintF(o,':PTR TO CHAR',NIL)
  197.               CASE T_PTR_TO_TagItem;  VFPrintF(o,':PTR TO TagItem',NIL)
  198.               ENDSELECT
  199.               next:=IF (src[pos]=",")||(src[pos]="/") THEN TRUE ELSE FALSE
  200.               IF next THEN VFPrintF(o,',',NIL)
  201.               pos++
  202.               p++
  203.               IF CtrlC() THEN RETURN
  204. //              WriteF('\d\n',pos)
  205.             ENDWHILE
  206.           ENDIF
  207.         ENDIF
  208.         IF cpu="68k" THEN VFPrintF(o,')(d0)=-\d',[offset]) ELSE VFPrintF(o,')(r3)=-\d',[offset])
  209.       ENDIF
  210.       offset+=6
  211.       pos:=NextLine(src,pos,length)
  212.     ENDIF
  213.     IF CtrlC() THEN RETURN
  214.   ENDWHILE
  215.   VFPrintF(o,'\n',NIL)
  216. ENDPROC
  217.  
  218. PROC NextLine(src:PTR TO CHAR,pos,length)(LONG)
  219.   WHILE src[pos]<>"\n"
  220.     pos++
  221.   EXITIF pos>length
  222.     IF CtrlC() THEN RETURN
  223.   ENDWHILE
  224. ENDPROC pos+1                           // skip "\n"
  225.  
  226. PROC WordLength(src:PTR TO CHAR,pos,length)(LONG)
  227.   DEF l=0
  228.   WHILE IsAlpha(src[pos])
  229.     l++
  230.     pos++
  231.   EXITIF pos>length
  232.     IF CtrlC() THEN RETURN
  233.   ENDWHILE
  234. ENDPROC l
  235.  
  236. PROC IsAlpha(c)(LONG) IS IF ((((c>="A")&&(c<="Z"))||((c>="a")&&(c<="z")))||((c>="0")&&(c<="9")))||(c="_") THEN TRUE ELSE FALSE
  237.